package pfc.ventanas;


import java.util.LinkedList;
import java.util.Vector;
import java.io.File;

//Imports Java Swing
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


import pfc.Aplicacion;
import pfc.Interfaz;
import pfc.ventanas.Ventana;
import pfc.ventanas.WindowAdapterConversacion;
import pfc.mensaje.*;
import pfc.Usuario;
import pfc.Conversacion;
import pfc.Grupo;
import pfc.Constantes;

/**
 *
 * Implementa la ventana de la conversacion.
 * @author Gabriel Reus Rodríguez
 * @version 1.0, 19/11/2010
*/

public class VentanaConversacion extends Ventana implements ActionListener
{
	private final static String NOMBRE_TEXTAREA_GENERAL="textArea general";
	private final static String NOMBRE_TEXTFIELD_ENTRADA="textfield entrada";
	private final static String ACCION_BOTON_ENVIAR="boton enviar";

	private Conversacion conversacion;

	private JTextArea jtAreaOutput=null;
	private JTextField inputTexto=null;
	private JScrollPane scroll=null;
	private JScrollPane scroll_lista=null;
	private JList lista_usuarios=null;

	/**
	 * Constructor de la ventana de conversacion
	*/
	public VentanaConversacion()
	{
		super(null);
		createGui();
	}

	public VentanaConversacion(Aplicacion a,Conversacion conv)
	{
		super(a);
		this.conversacion=conv;
		createGui();
		// trap window close and do something in an anonymous inner class
		frame.addWindowListener(new WindowAdapterConversacion(a,conv));
	}

	/**
	 * Crea la interfaz
	*/
	private void createGui()
	{

		JFrame.setDefaultLookAndFeelDecorated(true);
		// Create and set up the window.
		frame = new JFrame("Conversación: "+conversacion.getId());
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setJMenuBar(this.createJMenuBar());
		frame.setContentPane(this.createContentPane());
		frame.setSize(Constantes.TAMANO_VENTANA_CONVERSACION_X, Constantes.TAMANO_VENTANA_CONVERSACION_Y);
		frame.setVisible(true);
	}
	/**
	 * Carga el icono del cual le pasamos el path.
	*/
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = VentanaConversacion.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find image file: " + path);
			return null;
		}
	}

	/**
	*Crea el contenido de la ventana principal
	*/
	private Container createContentPane() {
		// Create the content-pane-to-be.
		JPanel jplContentPane = new JPanel();
		jplContentPane.setLayout(new GridBagLayout());
		jplContentPane.setOpaque(true);

	        GridBagConstraints gBC = new GridBagConstraints();

		JPanel panelListaUsuarios = new JPanel();
		panelListaUsuarios.setLayout(new GridBagLayout());

		Grupo grp = this.conversacion.getGrupo();
		
		
		Vector<String> users= new Vector<String>();

		LinkedList<Usuario> usuarios = grp.getUsuarios();
		for ( int i=0;i<usuarios.size();i++)
		{
			Usuario us= usuarios.get(i);
			users.add(us.getId());
		}
		lista_usuarios= new JList(users);
		lista_usuarios.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		gBC.gridwidth = GridBagConstraints.REMAINDER;
		panelListaUsuarios.add(lista_usuarios, gBC);		
		gBC.gridwidth = GridBagConstraints.RELATIVE;
		jplContentPane.add(panelListaUsuarios, gBC);
		

		JPanel general = new JPanel();
		general.setLayout(new GridBagLayout());

		jtAreaOutput = new JTextArea(20, 35);
		jtAreaOutput.setName(NOMBRE_TEXTAREA_GENERAL);
		jtAreaOutput.setEditable(false);
		jtAreaOutput.setLineWrap(true);
		jtAreaOutput.setRows(20);

		scroll = new JScrollPane(jtAreaOutput);
		scroll.setName("Scroll_general");
		gBC.gridwidth = GridBagConstraints.REMAINDER;
		general.add(scroll,gBC);

		inputTexto= new JTextField(20);
		inputTexto.setName(NOMBRE_TEXTFIELD_ENTRADA);
		//http://download.oracle.com/javase/1.5.0/docs/api/java/awt/GridBagLayout.html
		//gBC.fill = GridBagConstraints.HORIZONTAL;
		gBC.gridwidth = GridBagConstraints.RELATIVE;
		general.add(inputTexto,gBC);

		//Agrego un boton		
		JButton button = new JButton("Envíar");
		button.setActionCommand(ACCION_BOTON_ENVIAR);
		button.addActionListener(this);		
		gBC.gridwidth = GridBagConstraints.RELATIVE;

		general.add(button,gBC);

		jplContentPane.add(general, gBC);

		return jplContentPane;
	}

	/**
	 * Crea la barra de menu
	*/
	private JMenuBar createJMenuBar() {

		JMenuBar mainMenuBar;
		JMenu menuArchivo, menuAyuda;//, submenu;
		//Creo la barra de menus.
		mainMenuBar = new JMenuBar();
		//Creo la primera pestaña.
		menuArchivo = new JMenu("Archivo");

		mainMenuBar.add(menuArchivo);
		//Creo los items del menu Archivo.
		//Nueva Ventana
		JMenuItem NuevaVentanaMenuItem = new JMenuItem("Enviar fichero",
				KeyEvent.VK_T);
		NuevaVentanaMenuItem.setActionCommand("enviar_fichero");
		// can be done either way for assigning shortcuts
		// menuItem.setMnemonic(KeyEvent.VK_T);
		// Accelerators, offer keyboard shortcuts to bypass navigating the menu
		// hierarchy.
		NuevaVentanaMenuItem.addActionListener(this);
		menuArchivo.add(NuevaVentanaMenuItem);

		return mainMenuBar;		
	}

	/**
	*Crea la ventana para seleccionar el fichero a enviar.
	*/
	private void creaDialogo_Fichero()
	{

		dialog = new JDialog();


		dialog.setTitle("Selecciona el fichero para enviar");
		dialog.setLocationRelativeTo(frame); // Centro la posicion. queda pendiente de revision

		Container contentPane = dialog.getContentPane();
		contentPane.setLayout(new GridBagLayout());
	        GridBagConstraints gBC = new GridBagConstraints();


		JFileChooser fichero = new JFileChooser();
		fichero.addActionListener(this);
		fichero.setName("Fichero");
		contentPane.add(fichero, gBC);

		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		dialog.setSize(new Dimension(600, 500));
		dialog.setVisible(true);

		return;
	}



	/**
	 * Escucha los eventos.
	*/
	public void actionPerformed(ActionEvent e) {
	//Distingo los eventos por JMenuItem y JTextField (getClassName(e.getSource())
		//Enviar mensaje a todos
		System.out.println("Fuente: "+getClassName(e.getSource())+"accion: "+e.getActionCommand());
		//enviar_fichero
		if( 	("JMenuItem".equalsIgnoreCase(getClassName(e.getSource()))) && 
			("enviar_fichero".equalsIgnoreCase(e.getActionCommand())) 
		  )
		{
			creaDialogo_Fichero();
			//Interfaz.addVentana();
		}
		//Cancelar fichero
		if( 	("JFileChooser".equalsIgnoreCase(getClassName(e.getSource()))) && 
			("CancelSelection".equalsIgnoreCase(e.getActionCommand())) 
		  )
		{
			//cierro  el dialogo.
			dialog.dispose();
			//Interfaz.addVentana();
		}
		//Abrir fichero
		if( 	("JFileChooser".equalsIgnoreCase(getClassName(e.getSource()))) && 
			("ApproveSelection".equalsIgnoreCase(e.getActionCommand())) 
		  )
		{
			//Para cada miembro de la conversación envio el fichero.
			 JFileChooser fichero = (JFileChooser)obtenComponente("Fichero",dialog.getContentPane());
			 File file = fichero.getSelectedFile();
			 Fichero mensaje = new Fichero(this.aplicacion.getCliente().getGrupo(),this.conversacion,aplicacion.getUsuario());
			try
			{
				mensaje.obtenFichero(file.getAbsolutePath());
			}
			catch(Exception ex)
			{
				notificaExcepcion(ex);
				dialog.dispose();
				return;
			}
			//Para cada usuario, envio el mensaje.
			Grupo grp= conversacion.getGrupo();
			LinkedList<Usuario> usuarios = grp.getUsuarios();
			String id_usuario_local= aplicacion.getUsuario().getId();
			for(int i=0;i<usuarios.size();i++)
			{
				Usuario us= usuarios.get(i);
				if(!id_usuario_local.equals(us.getId()))
				{
					 try
					{
						aplicacion.enviarMensaje(us, mensaje);
						escribeGeneral("Enviado fichero "+file.getAbsolutePath()+" a "+us.getNick());
					}			
					catch(Exception ex)
					{
						notificaExcepcion(new Exception("No se pudo enviar el fichero: "+file.getAbsolutePath()+" al usuario: "+us.getNick()));
					}

				}

			}
			

			//cierro  el dialogo.
			dialog.dispose();
			//Interfaz.addVentana();
		}
		//Enviar texto
		if( 	("JButton".equalsIgnoreCase(getClassName(e.getSource()))) && 
			(this.ACCION_BOTON_ENVIAR.equalsIgnoreCase(e.getActionCommand())) 
		  )
		{
			//No escribo nada porque recibiré el propio multicast
			try
			{
				Grupo grp=this.conversacion.getGrupo();
				LinkedList<Usuario> usuarios = grp.getUsuarios();
				String id_usuario_local= aplicacion.getUsuario().getId();

				//Creo el nuevo mensaje.
				Texto txt= new Texto(inputTexto.getText(),this.aplicacion.getCliente().getGrupo(),this.conversacion,aplicacion.getUsuario());			
				for (int i=0;i<usuarios.size();i++)
				{
					Usuario us= usuarios.get(i);
					//Si no somos nosotros mismos...
					if(!id_usuario_local.equals(us.getId()))
					{
						aplicacion.enviarMensaje(us,txt);
					}
				}
//				aplicacion.enviarMensajeMultiCast(new Texto(inputTexto.getText(),this.aplicacion.getCliente().getGrupo(),null,aplicacion.getUsuario()));
				escribeGeneral(txt.getTextoFormato());
				escribeEntrada("");
			}
			catch(Exception ex)
			{
				notificaExcepcion(ex);
			}
			//Envío un mensaje a multicast ( requiere coger el texto)
			//			creaDialogo_Sobre();
			//Interfaz.addVentana();
		}

	}

	/**
	*Escribe el texto que le pasamos por parámetro en el textArea general.
	*/
	public void escribeGeneral(String txt)
	{
		this.jtAreaOutput.append(txt+"\n");
		Dimension tamanhoTextArea = this.jtAreaOutput.getSize();
		Point p = new Point(
		   0,
		   tamanhoTextArea.height);
		scroll.getViewport().setViewPosition(p);
	}

	/**
	*Escribe el texto que le pasamos por parámetro en el textField de entrada.
	*/
	public void escribeEntrada(String txt)
	{
		this.inputTexto.setText(txt);
	}

	/**
	*Informa de una excepción al usuario en la ventana principal.
	*/
	public void notificaExcepcion(Exception e)
	{
		escribeGeneral("EXCEPCION: "+e.getMessage());
	}

	/**
	*Actualiza la lista de usuarios que participan en la conversación.
	*/
	public void actualizaUsuarios()
	{
		LinkedList<Usuario> usuarios= null;
		Grupo grp= conversacion.getGrupo();
		usuarios= grp.getUsuarios();
		Vector<String> users= new Vector<String>();
		for (int i=0;i< usuarios.size();i++)
		{
			Usuario us = usuarios.get(i);
			users.add(us.getId());
		}
		lista_usuarios.setListData(users.toArray());
	}

	/**
	*Obtiene la id de la conversación que representa la ventana.
	*/
	public int getIdConversacion()
	{
		return conversacion.getId();
	}



}
